#ifndef __QyGLScene__
#define __QyGLScene__

#include <QtGui/QGraphicsScene>
#include <QyMath.h>
#include <QyGLSettings.h>

namespace QyGL {

class Scene : public QGraphicsScene {
public:
    explicit Scene( const ViewSettings & viewSettings = ViewSettings() );
    virtual ~Scene();

    QyMath::Vector camPos() const { return p_camPos; } //!< Положение камеры на сцене
    QyMath::Vector camDir() const { return p_camDir; } //!< Параметры обзора (наклон камеры по осям)
    QyMath::Vector camOffset() const { return p_camOffset; } //!< Смещение камеры относительно ее положения на сцене
    virtual QyMath::Vector glCursor() const { return p_glCursor; } //!< Точка на сцене под курсором мыши, с привязкой к плоскости XY поднятой или опущеной на некоторое значение cursorZ
    qreal cursorZ() const { return p_cursorZ; } //!< Высота плоскости курсора (по умолчанию 0)
    virtual QPoint cursorPos() const { return p_pos; }

    void setCamPos( const QyMath::Vector & vec ) { p_camPos = vec; } //!< Установить положение камеры
    void setCamDir( const QyMath::Vector & vec ) { p_camDir = vec; } //!< Установить обзор
    void setCamOffset( const QyMath::Vector & vec ) { p_camOffset = vec; } //!< Установить смещение
    void setCursorPlaneZ( qreal z ); //!< Установить высоту плоскости курсора
    void beginSelect( int x, int y, quint32 selectBufferSize = 512 ); //!< Перейти в режим выбора
    quint32 endSelect(); //!< Закончить выбор, вернет число попаданий
    quint32 * selectBuffer() const { return p_selectBuffer; } //!< Получить буффер выбора
    ViewSettings viewSettings() const { return p_viewSettings; }
    bool isInitialized() const { return p_initialized; }
    void setupCam();

    static QyMath::Vector mapToGL( const QPointF & pos );
    static QPointF mapFromGL( const QyMath::Vector & pos );

protected:
    virtual void initialize();
    virtual void paint();
    virtual void resize( qreal width, qreal height );

private:
    void drawBackground( QPainter * painter, const QRectF & rect );
    void mouseMoveEvent( QGraphicsSceneMouseEvent * event );
    void timerEvent( QTimerEvent * event );

    QyMath::Vector p_camPos,
                   p_camDir,
                   p_camOffset,
                   p_glCursor;
    qreal p_cursorPlane[4],
        p_cursorZ;
    quint32 * p_selectBuffer;
    QPoint p_pos;
    ViewSettings p_viewSettings;
    bool p_initialized;
    int timerId;

};

};

#endif//__QyGLScene__
